package com.atguigu.userprofile.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.userprofile.bean.TagCondition;
import com.atguigu.userprofile.bean.TaskInfo;
import com.atguigu.userprofile.bean.UserGroup;
import com.atguigu.userprofile.service.UserGroupService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zhangchen
 * @since 2021-05-04
 */
@RestController
public class UserGroupController {

    @Autowired
    UserGroupService userGroupService;

    @RequestMapping("/user-group-list")
    @CrossOrigin
    public String  getUserGroupList(@RequestParam("pageNo")int pageNo , @RequestParam("pageSize") int pageSize){
        int startNo=(  pageNo-1)* pageSize;
        int endNo=startNo+pageSize;

        QueryWrapper<UserGroup> queryWrapper = new QueryWrapper<>();
        int count = userGroupService.count(queryWrapper);

        queryWrapper.orderByDesc("id").last(" limit " + startNo + "," + endNo);
        List<UserGroup> userGroupList = userGroupService.list(queryWrapper);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("detail",userGroupList);
        jsonObject.put("total",count);

        return  jsonObject.toJSONString();
    }

//接收请求
//调用服务层
//返回结果


//  1  把分群的基本信息，保存在mysql中
//   2  计算出该分群的用户群体(人群包) , uid的集合，由clickhouse负责，通过bitmap间的集合计算完成。
//   3  把计算结果保存在可以处理高qps 的数据容器中，redis 、mysql也可以。

    @PostMapping("/user-group")
    public  String  saveUserGroup(@RequestBody  UserGroup userGroup){
   //  1  把分群的基本信息，保存在mysql中

        userGroupService.saveUserGroupInfo(userGroup);

  //   2  计算出该分群的用户群体(人群包) , uid的集合，由clickhouse负责，通过bitmap间的集合计算完成。
        userGroupService.genUserGroupUids(  userGroup  );

  //   3  把计算结果保存在可以处理高qps 的数据容器中，redis 、mysql也可以。
        userGroupService.saveUserGroupUidsToReids(userGroup);
  //   4  更新人数
        Long evaluateNum = userGroupService.evaluateNum(userGroup);
        userGroup.setUserGroupNum(evaluateNum);
        userGroupService.saveUserGroupInfo(userGroup);
        return  "success";

    }


    @PostMapping("/user-group-evaluate")
    public Long userGroupEualuate(@RequestBody  UserGroup userGroup){
        Long evaluateNum = userGroupService.evaluateNum(userGroup);
        return evaluateNum;
    }


    @PostMapping("/user-group-refresh/{userGroupId}")
    public String  userGroupRefresh(@PathVariable("userGroupId") String userGroupId
            ,@RequestParam("busiDate")String busiDate){
        // 删除原有的人群包 （ck,redis)
        userGroupService.clearUserGroupUidRedis(userGroupId);
        userGroupService.clearUserGroupUidCk(userGroupId);

        // 重新生成人群包
        UserGroup userGroup = userGroupService.getById(userGroupId);
        List<TagCondition> tagConditionList = JSON.parseArray(userGroup.getConditionJsonStr(), TagCondition.class);
        userGroup.setTagConditions(tagConditionList);
        userGroup.setBusiDate(busiDate);
        userGroupService.genUserGroupUids(  userGroup  );
        //特别说明的问题： clickhouse的删除和修改 实际上是异步的！！！
        //把结果搬运到redis因为清理是异步的
        //所以很有可能把旧数据又搬运回来了 //重新改造redis的uid的生成方式（解耦)
        userGroupService.saveUserGroupUidsToReids(userGroup);
        //

        // 修改保存基本信息
        Long evaluateNum = userGroupService.evaluateNum(userGroup);
        userGroup.setUserGroupNum(evaluateNum);
        userGroup.setUpdateTime(new Date());
        userGroupService.saveOrUpdate(userGroup);


        return "success";
    }



}

